# FontForge が使用する TrueType/OpenType への非標準の拡張

## 非標準の機能タグ

内部的に使用

- `‘ REQ’`― 必須の機能に使用されるタグ

TeX 用

- `ITLC` ― イタリック補正 これを OpenType への拡張として提案したことがあります。これに関して多少の議論がありましたが、このアイディアは却下されたのだと思います。
- `TCHL` ― TeX 文字リスト
- `TEXL` ― TeX 拡張リスト

## 非標準のテーブル

- ‘PfEd’ (FontForge の拡張テーブル)
- ‘TeX ’ (TeX メトリックテーブル)
- ‘BDF ’ (BDF 属性テーブル)
- (標準のテーブル)

## ‘PfEd’― FontForge の拡張テーブル

(歴史的事情により、‘PfEd’という名前になっています)

> このテーブルは、バージョン番号とサブテーブルの個数を含むヘッダで始まります。

> uint32 | version | 現在は 0x00010000
> uint32 | count |

> この後ろにテーブルの中身が続きます。以下のデータ構造 (つまり、各テーブルのタグとオフセット) が count 回だけ繰り返されます。

> uint32 | tag |
> uint32 | offset | ‘PfEd’テーブルの先頭から数える

> サブテーブルのフォーマットはそのサブテーブルのタグによって異なります。現在サポートされているのは、以下の 3 種類のタグです。

> - ‘colr’― 各グリフの色を表すサブテーブル (フォントビューで表示される色を格納する)
> - ‘cmnt’― グリフごとのコメントサブテーブル (各文字で文字情報ダイアログを呼び出した時に表示されるコメントを格納します)
> - ‘fcmt’― フォントコメントサブテーブル (フォント情報ダイアログで表示されるコメントを格納する)

### ‘colr’― 各グリフの色のサブテーブル

> このサブテーブルのヘッダはバージョン番号と範囲の個数で始まります。

> uint16 | version | 0
> uint16 | count | 範囲の個数

> この後ろに、以下の構造体が <count> 個だけ置かれます。

> uint16 | 最初のグリフインデックス |
> uint16 | 最後のグリフインデックス |
> uint32 | color | 24 ビット RGB 値として表現される

### ‘cmnt’― グリフコメント用のサブテーブル

> 範囲の個数

> この後ろに、以下の構造体が <count> 個だけ置かれます。

> uint16 | 最初のグリフインデックス |
> uint16 | 最後のグリフインデックス |
> uint32 | offset | このサブテーブルの先頭からの値

> offset は、バイトオフセットの配列を指し、その配列には (<end>-<start>+1+1) 個の要素が含まれます。これにより上記の範囲データ構造は、各グリフごとに 1 個のインデックスを表し、それに加え、最後の文字列の長さを計算できるように末尾に 1 個の要素が置かれています。

> uint32 | offset | テーブルの先頭からの値
> | ... |

> そしてこれらのオフセットは Unicode (UCS2) 文字列を指しています。文字列は順番に並んでいると見なすため、各文字列の長さは、その文字列のオフセットを次の文字列のオフセットから引き算することによって得られます。

### ‘fcmt’― フォントコメント用サブテーブル

> このサブテーブルのヘッダはバージョン番号と範囲の個数で始まります。

> uint16 | version | 0
> uint16 | length | 文字列中の文字数

> そしてこの後に <length> 個の Unicode (UCS2) 文字が続きます。現在はこれらの Unicode 文字は常に ASCII 値のみを含みますが、将来は変更される可能性があります。

## ‘TeX ’― TeX メトリックテーブル

> このテーブルは、バージョン番号とサブテーブルの個数を含むヘッダで始まります。

> uint32 | version | 現在は 0x00010000
> uint32 | count |

> この後ろにテーブルの中身が続きます。以下のデータ構造 (つまり、各テーブルのタグとオフセット) が count 回だけ繰り返されます。

> uint32 | tag |
> uint32 | offset | ‘PfEd’テーブルの先頭から

> サブテーブルのフォーマットはサブテーブルのタグによって異なります。現在のところ、以下の 3 種類のタグがサポートされています。

> - ‘ftpm’― フォントパラメータテーブル
> - ‘htdp’― 各グリフの高さ/深さ (TeX の考える、各グリフの高さと深さ (視覚的オーバーシュートが補正された値) のサブテーブル
> - ‘sbsp’― 各グリフの下つき/上つき文字のサブテーブル

### ‘htdp’― グリフ表示色用サブテーブル

> このサブテーブルのヘッダはバージョン番号とグリフの個数で始まります。

> uint16 | version | 0
> uint16 | count | グリフの個数

> この後ろに、以下の構造体が <count> 個だけ置かれます。

> uint16 | height | em ユニット単位
> uint16 | depth |

これらの値は TFM ファイルの fix_word ではなく em ユニット単位の値で格納しています。なぜなら、sfnt においてより意味があるのは em ユニットであり、スペース消費も少ないからです。

### ‘sbsp’― グリフコメント用のサブテーブル (訳註:誤植。「下つき/上つき文字用サブテーブル」)

> このテーブルのフォーマットは前述のテーブルと本質的に同じです。サブテーブルのヘッダは、バージョン番号とグリフの個数で始まります。

> uint16 | version | 0
> uint16 | count | グリフの個数

> この後ろに、以下の構造体が <count> 個だけ置かれます。

> uint16 | 下つき文字のオフセット | em ユニット単位の値
> uint16 | 上つき文字のオフセット |

これらの値は TFM ファイルの fix_word ではなく em ユニット単位の値で格納しています。なぜなら、sfnt においてより意味があるのは em ユニットであり、スペース消費も少ないからです。

### ‘ftpm’― フォントパラメータ (フォントディメンジョン) 用サブテーブル

> このサブテーブルのヘッダはバージョン番号とパラメータの個数で始まります:

> uint16 | version | 0
> uint16 | count | フォントに含まれるパラメータの個数

> そしてこの後に続くのは、以下の構造体の <count> 要素の繰り返しです:

> uint32 | タグ | パラメータ名
> int32 | 値 |

> これらの値は TFM ファイルの fix_word で格納されており、em ユニット単位の値ではありません。なぜなら、この値の意味は仕様で規定されておらず、(少なくとも) `Slant`パラメータは em ユニットに変換できないからです。

> 定義済みの 4 文字のパラメータタグは以下のとおりです。

> タグ | 意味 | TFM ファイルにおける伝統的なフォントパラメータ番号 (フォントディメンション番号)
> --- | --- | ---
> Slnt | スラント | 1
> Spac | スペース | 2
> Stre | 伸長度 | 3
> Shnk | 縮小度 | 4
> XHgt | x ハイト | 5
> Quad | クワタ幅 | 6
> ExSp | 追加スペース | 7 (テキストフォントの場合)
> MtSp | Math Space | 7 (数学フォント・拡張数学フォントの場合)
> Num1 | ディスプレイスタイルまたは圧縮ディスプレイスタイルにおける分子の持ち上げ量 | 8 (数学フォントの場合)
> Num2 | (圧縮)ディスプレイスタイル以外での \atop または \atopwithdelims による分子の持ち上げ量 | 10
> Dnm1 | ディスプレイスタイルまたは圧縮ディスプレイスタイルにおける分母の引き下げ量 | 11
> Dnm2 | (圧縮)ディスプレイスタイル以外での分母の引き下げ量 | 12
> Sup1 | ディスプレイスタイルにおける、文字につく上つき文字の持ち上げ量の最小値 | 13
> Sup2 | テキスト・上(下)付き文字・二重上(下)付き文字スタイルにおける、文字につく上つき文字の持ち上げ量の最小値 | 14
> Sup3 | 圧縮されたスタイルにおける、文字につく上つき文字の持ち上げ量の最小値 | 15
> Sub1 | 上つき文字が無い場合の、文字につく下つき文字の引き下げ量の最小値 | 16
> Sub2 | 上つき文字と下つき文字が同時につく場合の、文字につく下つき文字の引き下げ量の最小値 | 17
> SpDp | 上つき文字のベースラインより上の部分が、親文字と重なり合う最大量 | 18
> SbDp | 下つき文字のベースラインより下の部分が、親文字と重なり合う最大量 | 19
> Dlm1 | (圧縮)ディスプレイスタイルにおいて、分数を構成する垂直ボックスを囲む区切り記号の(高さ+深さ)の最小値 | 20
> Dlm2 | ディスプレイスタイル以外において、分数を構成する垂直ボックスを囲む区切り記号の(高さ+深さ)の最小値 | 21
> AxHt | 軸の高さ (\vcenter による垂直揃え位置の、(高さ+深さ)/2より得られる真の中心からの持ち上げ量) | 22
> RlTk | 罫線のデフォルトの太さ | 8 (拡張数学フォントの場合)
> BOS1 | Big Op Spacing1 | 9
> BOS2 | Big Op Spacing2 | 10
> BOS3 | Big Op Spacing3 | 11
> BOS4 | Big Op Spacing4 | 12
> BOS5 | Big Op Spacing5 | 13

## ‘BDF ’ ― BDF 属性テーブル

> このテーブルはバージョン番号とサイズ違いの個数を含むヘッダから始まります。

> uint16 | バージョン | 現在は 0x0001
> uint16 | サイズ違いの個数 |
> uint32 | 文字列テーブルへのオフセット | (BDF テーブルの先頭から数えた値)

> それに続き、各サイズごとに、それぞれ何個の属性が含まれるかを識別するデータ項目が続きます。

> uint16 | EM あたりピクセル数 |
> uint16 | 配列 property-count (属性の個数) |

> その次に属性の値が置かれます。まず最初のビットマップサイズの属性が property-count[1] 個だけ並び、次に property-count[2] 個の属性が、というように並びます。各属性の形式は以下のとおりです:

> uint32 | 名前 | 属性名の文字列テーブルにおけるオフセット
> uint16 | データ型 | 0 ⇒ 文字列 1 ⇒ アトム 2 ⇒ 整数 3 ⇒ 正整数 真の属性であることを示すために上のどれかの値と 0x10 との or を取った値も許されます。
> uint32 | 値 | 文字列とアトムの場合、文字列テーブル内のオフセット値を格納 整数では値をそのまま格納

> 文字列テーブルは ASCII のバイト列を並べたものです。各文字列は NUL で終端されています。